<?php
namespace Modules\Admin\Libraries;

class JWT extends \Phalcon\Di\Injectable {
  private $key = null;
  /**
   * 设置token
   **/
  public function setToken($payload) {
    /**
     * jwt Header 参数解释
     * alg(algorithm) : 加密算法。
     *
     * jwt Payload 参数解释
     * aud(audience)   : 接收者。
     * exp(expires in) : 什么时候过期(UNIX时间)。
     * iat(issued at)  : 在什么时候签发的(UNIX时间)。
     * iss(issuer)     : 该JWT的发行者/签发者。
     * nbf(not before) : token在此时间之前不能被接收处理。
     * sub(subject)    : 该JWT所面向的用户。
     * jti(jwt ID)     : 为web token提供唯一标识
     **/

    $currentTime = time();
    //$payload['aud'] = '';
    $payload['exp'] = $currentTime + 7200;
    $payload['iat'] = $currentTime;
    //$payload['iss'] = 'xfh';
    $payload['nbf'] = $currentTime;
    //$payload['sub'] = '';

    return \Jose\Factory\JWSFactory::createJWSToCompactJSON($payload, $this -> getKey(), [
      //'crit' => ['exp', 'aud'],
      'alg'  => 'HS512'
    ]);
  }

  public function checkToken($token) {
    try {
      $jws = (new \Jose\Loader()) -> loadAndVerifySignatureUsingKey($token, $this -> getKey(), ['HS512']);

      \Jose\Factory\CheckerManagerFactory::createClaimCheckerManager(['exp', 'iat', 'nbf']) -> checkJWS($jws, 0);
    } catch(\Exception $e) {
      return ['code' => -1, 'message' => $e -> getMessage()];
    }

    return ['code' => 0, 'message' => '验证成功！', 'data' => $jws -> getPayload()];
  }

  public function getKey() {
    if(is_null($this -> key)) {
      if($this -> backendCache -> exists('jwt_key')) {
        $key = $this -> backendCache -> get('jwt_key');
      } else {
        $key = \Jose\Factory\JWKFactory::createOctKey([
          'size' => 128
        ]) -> getAll();

        $this -> backendCache -> save('jwt_key', $key);
      }

      $this -> key = \Jose\Factory\JWKFactory::createFromValues($key);
    }

    return $this -> key;
  }
}
?>